Elastic BeanstalkのCNAME Swapを試してみる
ビールは常にサッポロクラシック派の佐々木です。ちなみに僕、社内ではすもけって呼ばれているんですが、たまに客先でもナチュラルにすもけって言う人(主に社長)がいるので、そろそろ本名も改名したほうがいい良いかも知れないなって思ってます。
はじめに
アプリケーションをデプロイするときの新バージョンへの切り替えは、同一サーバで上書きする場合もあれば、別環境を作成して切り替える(いわゆるBlue-Green Deployment)など、様々な手法があります。
Elastic BeanstalkにはCNAME Swapを使う手法があります。この手法では、あるバージョンのアプリケーションをデプロイ後、新しいバージョンのアプリケーションを違う環境(Environment)としてデプロイします。BeanstalkではEnvironmentごとにCNAMEによる名前が付与されます。
CNAME Swapをすることで、Environmentに付与されたCNAMEを入れ替えることが出来ます。これで既存バージョンを残したまま、他の箇所を変更することなく、そして利用者が意識することなく、新バージョンに移行することが出来ます。
ということを、実際に手を動かして試してみました!
やってみた
事前準備
Beanstalkを操作するためのawsebcliをインストールします。またBeanstalkを操作可能なIAMアカウントの認証情報もセットします。
$ pip install awsebcli $ aws configure
Beanstalkの初期設定
アプリケーション用のディレクトリを作成し、gitの設定をしておきます。
$ mkdir ebapp $ cd ebapp $ git init .
eb initにてBeanstalkアプリケーションの初期設定を行います。今回はRubyアプリケーションを作ります。
$ eb init Select an application to use 1) My First Elastic Beanstalk Application 2) [ Create new Application ] (default is 2): 2 Enter Application Name (default is "ebapp"): ebapp Application ebapp has been created. Select a platform. 1) Node.js 2) PHP 3) Python 4) Ruby 5) Tomcat 6) IIS 7) Docker 8) Multi-container Docker 9) GlassFish 10) Go (default is 1): 4 Select a platform version. 1) Ruby 2.2 (Puma) 2) Ruby 2.2 (Passenger Standalone) 3) Ruby 2.1 (Puma) 4) Ruby 2.1 (Passenger Standalone) 5) Ruby 2.0 (Puma) 6) Ruby 2.0 (Passenger Standalone) 7) Ruby 1.9.3 (default is 1): 1 Do you want to set up SSH for your instances? (y/n): n
最初のEnvironmentの作成
新しい、最初のEnvironmentを作成します。
$ eb create Enter Environment Name (default is ebapp-dev):ebapp-dev Enter DNS CNAME prefix (default is ebapp-dev):ebapp-dev
AWS管理コンソールで確認すると、以下のようにEnvironmentが追加されています。
以下のように、Sinatraで動くRubyアプリケーションを作成します。
$ vi config.ru require './index' run Sinatra::Application $ vi Gemfile source 'http://rubygems.org' gem 'sinatra' $ vi index.rb require 'sinatra' get '/' do "My First Elastic Beanstalk" end $ git add . $ git commit -m "1st commit"
では、作成したRubyアプリケーションをデプロイします。
$ eb deploy INFO: Environment update completed successfully.
ステータスを確認します。StatusがReady、HealthがGreenになっていればOKです。
$ eb status --verbose Environment details for: ebapp-dev Application name: ebapp Region: ap-northeast-1 Deployed Version: xxxx Environment ID: e-xxxxxxxx Platform: 64bit Amazon Linux 2015.03 v1.4.6 running Ruby 2.2 (Puma) Tier: WebServer-Standard CNAME: ebapp-dev.elasticbeanstalk.com Updated: 2015-08-05 04:51:56.409000+00:00 Status: Ready Health: Green Running instances: 1 i-xxxxxxxx: InService
eb openするとWebブラウザが開きます。
$ eb open
ちゃんと動いてますね。
新バージョンのEnvironmentの作成
新しいバージョンのアプリケーション用に、Environmentを追加作成します。
$ eb create Enter Environment Name (default is ebapp-dev2): Enter DNS CNAME prefix (default is ebapp-dev2):
AWS管理コンソールでも追加されています。
アプリケーションのソースコードも変更しておきます。
$ vi index.rb require 'sinatra' get '/' do "My Second Elastic Beanstalk" end $ git add index.rb $ git commit -m "2nd commit"
変更したアプリケーションを、新しいEnvironmentにdeployします。
$ eb deploy ebapp-dev2
ステータスの確認。
$ eb status ebapp-dev2 --verbose Environment details for: ebapp-dev2 Application name: ebapp Region: ap-northeast-1 Deployed Version: yyyy Environment ID: e-yyyyyyyy Platform: 64bit Amazon Linux 2015.03 v1.4.6 running Ruby 2.2 (Puma) Tier: WebServer-Standard CNAME: ebapp-dev2.elasticbeanstalk.com Updated: 2015-08-05 06:13:14.618000+00:00 Status: Ready Health: Green Running instances: 1 i-yyyyyyyy: InService
では開いてみましょう。
$ eb open ebapp-dev2
新しいバージョンのアプリケーションになっていますね(FirstがSecondになっています)
CNAME Swapする
ここが本題。eb swapします。
$ eb swap INFO: swapEnvironmentCNAMEs is starting. INFO: Swapping CNAMEs for environments 'ebapp-dev' and 'ebapp-dev2'. INFO: 'ebapp-dev2.elasticbeanstalk.com' now points to 'awseb-e-r-AWSEBLoa-hoge-1234.ap-northeast-1.elb.amazonaws.com'. INFO: Completed swapping CNAMEs for environments 'ebapp-dev' and 'ebapp-dev2'.
AWS管理コンソールを見ると、それぞれのURLが入れ替わってます。
Webブラウザでアクセスすると、もちろん結果も入れ替わってます!
さいごに
実は初めてElastic Beanstalkを触ったんですけど、これは確かに簡単ですね。スケールする環境をサクサク作れるのはとても魅力的だと思いました。